package cn.fuxi2022.rabbitmq.appletsPay.config;

import cn.fuxi2022.rabbitmq.appletsPay.constants.WeChatPayConstants;
import cn.fuxi2022.rabbitmq.appletsPay.properties.WeChatMQProperties;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;

@Configuration
public class WeChatPayRabbitMQConfig {

    /**
     * 订单超时交换机
     */
    @Bean
    public FanoutExchange orderTtlExchange() {
        // 持久化打开+自动删除关闭
        return new FanoutExchange(WeChatPayConstants.GROUP_ORDER_TTL_EXCHANGE, true, false);
    }

    /**
     * 订单超时交换机 的 订单超时队列
     */
    @Bean
    public Queue orderTtlQueue() {
        // 创建队列参数
        HashMap<String, Object> map = new HashMap<>();
        // 消息的生存时间
        map.put("x-message-ttl", WeChatMQProperties.GROUP_ORDER_TTL_ORDER_QUEUE_TIME);
        // 超过订单的生产时间，要求不要丢掉消息消息，而是进入死信队列
        map.put("x-dead-letter-exchange", WeChatPayConstants.GROUP_ORDER_DLE_EXCHANGE);
        // 将删除的消息推送到指定交换机(死信交换机)的指定路由键的队列中去
        map.put("x-dead-letter-routing-key", "order.ttl");
        // 打开队列持久化 + 排他队列 + 自动删除关闭
        return new Queue(WeChatPayConstants.GROUP_ORDER_TTL_ORDER_QUEUE, true, false, false, map);
    }

    /**
     * 订单超时交换机 的 提醒超时队列
     */
    @Bean
    public Queue alertTtlQueue() {
        // 创建队列参数
        HashMap<String, Object> map = new HashMap<>();
        // 消息的生存时间
        map.put("x-message-ttl", WeChatMQProperties.GROUP_ORDER_TTL_ORDER_ALERT_TIME);
        // 超过订单的生产时间，要求不要丢掉消息消息，而是进入死信队列
        map.put("x-dead-letter-exchange", WeChatPayConstants.GROUP_ORDER_DLE_EXCHANGE);
        // 将删除的消息推送到指定交换机(死信交换机)的指定路由键的队列中去
        map.put("x-dead-letter-routing-key", "alert.ttl");
        // 打开队列持久化 + 排他队列 + 自动删除关闭
        return new Queue(WeChatPayConstants.GROUP_ORDER_TTL_ALERT_QUEUE, true, false, false, map);
    }

    /**
     * 订单超时队列 绑定 订单超时交换机
     */
    @Bean
    public Binding orderToTtlExchange() {
        return BindingBuilder.bind(orderTtlQueue()).to(orderTtlExchange());
    }

    /**
     * 提醒超时队列 绑定 订单超时交换机
     */
    @Bean
    public Binding alertToTtlExchange() {
        return BindingBuilder.bind(alertTtlQueue()).to(orderTtlExchange());
    }


    // ----------------------------------------------------------------------------------------


    /**
     * 订单死信交换机
     */
    @Bean
    public DirectExchange orderDleExchange() {
        // 持久化打开+自动删除关闭
        return new DirectExchange(WeChatPayConstants.GROUP_ORDER_DLE_EXCHANGE, true, false);
    }

    /**
     * 订单死信交换机 的 订单死信队列
     */
    @Bean
    public Queue orderDleQueue() {
        return new Queue(WeChatPayConstants.GROUP_ORDER_DLE_ORDER_QUEUE);
    }

    /**
     * 订单死信交换机 的 提醒死信队列
     */
    @Bean
    public Queue alertDleQueue() {
        return new Queue(WeChatPayConstants.GROUP_ORDER_DLE_ALERT_QUEUE);
    }

    /**
     * 订单超时队列 绑定 订单超时交换机
     */
    @Bean
    public Binding orderToDleExchange() {
        return BindingBuilder.bind(orderDleQueue()).to(orderDleExchange()).with("order.ttl");
    }

    /**
     * 提醒超时队列 绑定 订单超时交换机
     */
    @Bean
    public Binding alertToDleExchange() {
        return BindingBuilder.bind(alertDleQueue()).to(orderDleExchange()).with("alert.ttl");
    }
}
